/**
 * 
 */
package com.ms.security.web.config;

import com.ms.security.web.filter.TimeFilter;
import com.ms.security.web.interceptor.TimeInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * @author zhailiang
 *
 */
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

	/*
	 *  过滤器 filter 可以拿到请求和响应信息，拿不到处理的请求和响应的控制器和方法
	 *  拦截器 Interceptor 既可以拿到请求和响应信息，也可以拿到处理的请求和响应的控制器和方法的信息，
	 *                    但是拿不到方法的参数的值
	 *  切片   aspect 可以拿到处理方法的参数的值，但是拿不到原始的请求和响应信息
	 *  请求的执行的拦截顺序
	 *   请求 filter->Interceptor->aspect->Controller
	 *   响应 Controller->aspect->ControllerAdvice(如果报错就有这个处理器处理)->Interceptor->filter
	 */


	@Autowired
	private TimeInterceptor timeInterceptor;


	/*  添加拦截器
	 *  1 自己写一个拦截器，继承HandlerInterceptor ，然后在在自己定义的拦截器上添加 @Component 注解
	 *  2 配置类（有@Configuration的类）中继承 WebMvcConfigurerAdapter 类，然后重写 addInterceptors 方法
	 *  3 导入自己定义的拦截器 @Autowired private TimeInterceptor timeInterceptor
	 *  4 在addInterceptors 方法中添加拦截器
	 * # 拦截器 没有办法拿到方法参数的值
	 * # 源码参考 DispatcherServlet->doService->doDispatch->(962行到971行，962行applyPreHandle调用applyPreHandle方法 967组装方法)
	 * # 如果想获取方法中的参数 就需要用到 切片Aspect
	 *
	 *
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
//		registry.addInterceptor(timeInterceptor);
	}



	/*
	 *
	 *  这个方法是注册异步拦截器的
	 *  @Override
	 *	public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
	 *	super.configureAsyncSupport(configurer);
	 *  configurer.registerCallableInterceptors(xxxInterceptor)
	 *  }
	 *
	 *
	 */


	/*  添加过滤器 有两种方式
	 *  1 自己写一个过滤器，继承Filter ，然后在在自己定义的过滤器上添加 @Component 注解
	 *  2 使用配置的方式，代码如下  启用时添加 @Bean 注解，如果不加表示不生效
	 * # 过滤器只能拿到 http的请求和响应，request, response，你只能从这些请求和响应获得一些参数
	 * # 这个请求（服务）由哪个控制器那个方法来处理的 Filter 是不知道的， controller是由springmvc控制的
	 * # 如果需要这些信息，需要用到 interceptor 拦截器，这个东西是spring提供的
	 */
	//	@Bean
	public FilterRegistrationBean timeFilter() {
		
		FilterRegistrationBean registrationBean = new FilterRegistrationBean();
		
		TimeFilter timeFilter = new TimeFilter();
		registrationBean.setFilter(timeFilter);
		
		List<String> urls = new ArrayList<>();
		urls.add("/*");
		registrationBean.setUrlPatterns(urls);
		
		return registrationBean;
		
	}

}
